home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / comm / mail / YAM23src.lha / Source / YAM_DI.c < prev    next >
C/C++ Source or Header  |  2001-05-08  |  12KB  |  326 lines

  1. /***************************************************************************
  2.  
  3.  YAM - Yet Another Mailer
  4.  Copyright (C) 1995-2000 by Marcel Beck <mbeck@yam.ch>
  5.  Copyright (C) 2000-2001 by YAM Open Source Team
  6.  
  7.  This program is free software; you can redistribute it and/or modify
  8.  it under the terms of the GNU General Public License as published by
  9.  the Free Software Foundation; either version 2 of the License, or
  10.  (at your option) any later version.
  11.  
  12.  This program is distributed in the hope that it will be useful,
  13.  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  GNU General Public License for more details.
  16.  
  17.  You should have received a copy of the GNU General Public License
  18.  along with this program; if not, write to the Free Software
  19.  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  20.  
  21.  YAM Official Support Site :  http://www.yam.ch
  22.  YAM OpenSource project    :  http://sourceforge.net/projects/yamos/
  23.  
  24.  $Id: YAM_DI.c,v 1.6 2001/05/08 22:27:37 damato Exp $
  25.  
  26. ***************************************************************************/
  27.  
  28. #include "YAM.h"
  29.  
  30. /* local protos */
  31. LOCAL void DI_FinishEdit(void);
  32. LOCAL void DI_Save(void);
  33. LOCAL int DI_Load(void);
  34. LOCAL struct DI_ClassData *DI_New(void);
  35.  
  36. /***************************************************************************
  37.  Module: Glossary
  38. ***************************************************************************/
  39.  
  40. /// DI_FinishEdit
  41. //  Adds/updates changed glossary entry
  42. LOCAL void DI_FinishEdit(void)
  43. {
  44.    struct DI_GUIData *gui = &G->DI->GUI;
  45.    int modified;
  46.    get(gui->TE_EDIT, MUIA_TextEditor_HasChanged, &modified);
  47.    if (modified && G->DI->OldEntry)
  48.    {
  49.       char *edtext = (char *)DoMethod((Object *)gui->TE_EDIT, MUIM_TextEditor_ExportText);
  50.       if (*edtext)
  51.       {
  52.          struct Dict new;
  53.          new.Text = StrBufCpy(NULL, edtext);
  54.          GetMUIString(new.Alias, gui->ST_ALIAS);
  55.          if (!*new.Alias) strcpy(new.Alias, GetStr(MSG_NewEntry));
  56.          FreeStrBuf(G->DI->OldEntry->Text);
  57.          *(G->DI->OldEntry) = new;
  58.          DoMethod(gui->LV_ENTRIES, MUIM_List_Redraw, MUIV_List_Redraw_All);
  59.       }
  60.       G->DI->Modified = TRUE;
  61.       FreeVec(edtext);
  62.    }
  63.    set(gui->TE_EDIT, MUIA_TextEditor_HasChanged, FALSE);
  64. }
  65.  
  66. ///
  67. /// DI_Save
  68. //  Saves glossary to disk
  69. LOCAL void DI_Save(void)
  70. {
  71.    FILE *fh;
  72.    struct Dict *entry;
  73.    int i;
  74.  
  75.    if (fh = fopen(G->DI_Filename, "w"))
  76.    {
  77.       Busy(GetStr(MSG_BusySavingDI), "", 0, 0);
  78.       fputs("YDI1 - YAM Dictionary\n", fh);
  79.       for (i = 0; ; i++)
  80.       {
  81.          DoMethod(G->DI->GUI.LV_ENTRIES, MUIM_List_GetEntry, i, &entry);
  82.          if (!entry) break;
  83.          fprintf(fh, "@ENTRY %s\n%s@ENDENTRY\n", entry->Alias, entry->Text);
  84.       }
  85.       fclose(fh);
  86.       G->DI->Modified = FALSE;
  87.       BusyEnd;
  88.    }
  89.    else ER_NewError(GetStr(MSG_ER_CantCreateFile), G->DI_Filename, NULL);
  90. }
  91.  
  92. ///
  93. /// DI_Load
  94. //  Load glossary from disk
  95. LOCAL int DI_Load(void)
  96. {
  97.    int entries = 0;
  98.    FILE *fh;
  99.    char buffer[SIZE_LARGE], *p;
  100.    struct Dict entry;
  101.  
  102.    if (fh = fopen(G->DI_Filename, "r"))
  103.    {
  104.       Busy(GetStr(MSG_BusyLoadingDI), "", 0, 0);
  105.       GetLine(fh, buffer, SIZE_LARGE);
  106.       if (!strncmp(buffer,"YDI",3))
  107.       {
  108.          set(G->DI->GUI.LV_ENTRIES, MUIA_List_Quiet, TRUE);
  109.          while (GetLine(fh, buffer, SIZE_LARGE))
  110.          {
  111.             clear(&entry, sizeof(struct Dict));
  112.             if (!strncmp(buffer, "@ENTRY", 6))
  113.             {
  114.                stccpy(entry.Alias, Trim(&buffer[7]), SIZE_NAME);
  115.                entry.Text = AllocStrBuf(80);
  116.                while (fgets(buffer, SIZE_LARGE, fh))
  117.                   if (p = strstr(buffer, "@ENDENTRY\n")) { *p = 0; entry.Text = StrBufCat(entry.Text, buffer); break; }
  118.                   else entry.Text = StrBufCat(entry.Text, buffer);
  119.                DoMethod(G->DI->GUI.LV_ENTRIES, MUIM_List_InsertSingle, &entry, MUIV_List_Insert_Bottom);
  120.                entries++;
  121.             }
  122.          }
  123.          set(G->DI->GUI.LV_ENTRIES, MUIA_List_Quiet, FALSE);
  124.       }
  125.       fclose(fh);
  126.       BusyEnd;
  127.    }
  128.    return entries;
  129. }
  130.  
  131. ///
  132. /// DI_CloseFunc
  133. //  Closes glossary window
  134. void SAVEDS DI_CloseFunc(void)
  135. {
  136.    DI_FinishEdit();
  137.    if (G->DI->Modified) DI_Save();
  138.    G->Weights[4] = GetMUI(G->DI->GUI.GR_LIST, MUIA_HorizWeight);
  139.    G->Weights[5] = GetMUI(G->DI->GUI.GR_TEXT, MUIA_HorizWeight);
  140.    DisposeModulePush(&G->DI);
  141. }
  142. MakeHook(DI_CloseHook, DI_CloseFunc);
  143.  
  144. ///
  145. /// DI_PasteFunc
  146. //  Pastes text of selected glossary entry into the internal editors
  147. void SAVEDS DI_PasteFunc(void)
  148. {
  149.    struct Dict *entry;
  150.    DI_FinishEdit();
  151.    DoMethod(G->DI->GUI.LV_ENTRIES, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &entry);
  152.    DoMethod(G->WR[G->DI->WrWin]->GUI.TE_EDIT, MUIM_TextEditor_InsertText, entry->Text);
  153.    DI_CloseFunc();
  154. }
  155. MakeHook(DI_PasteHook, DI_PasteFunc);
  156.  
  157. ///
  158. /// DI_DeleteFunc
  159. //  Removes selected entry from the glossary
  160. void SAVEDS DI_DeleteFunc(void)
  161. {
  162.     G->DI->Modified = TRUE;
  163.     G->DI->OldEntry = NULL;
  164.     DoMethod(G->DI->GUI.LV_ENTRIES, MUIM_List_Remove, MUIV_List_Remove_Active);
  165. }
  166. MakeHook(DI_DeleteHook, DI_DeleteFunc);
  167.  
  168. ///
  169. /// DI_DisplayFunc
  170. //  Displays selected glossary entry
  171. void SAVEDS DI_DisplayFunc(void)
  172. {
  173.    struct DI_GUIData *gui = &G->DI->GUI;
  174.    struct Dict *entry;
  175.  
  176.    DI_FinishEdit();
  177.    DoMethod(gui->LV_ENTRIES, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &entry);
  178.    DoMethod(G->App, MUIM_MultiSet, MUIA_Disabled, !entry, gui->ST_ALIAS, gui->SL_EDIT, gui->TE_EDIT, gui->BT_DELETE, gui->BT_PASTE, NULL);
  179.    nnset(gui->ST_ALIAS, MUIA_String_Contents, entry ? entry->Alias : "");
  180.    nnset(gui->TE_EDIT, MUIA_TextEditor_Contents, entry ? entry->Text : "");
  181.    G->DI->OldEntry = entry;
  182. }
  183. MakeHook(DI_DisplayHook, DI_DisplayFunc);
  184.  
  185. ///
  186. /// DI_ModifyFunc
  187. //  Saves changed glossary item
  188. void SAVEDS ASM DI_ModifyFunc(REG(a1,int *arg))
  189. {
  190.    struct Dict new;
  191.  
  192.    DI_FinishEdit();
  193.    strcpy(new.Alias, GetStr(MSG_NewEntry));
  194.    new.Text = AllocStrBuf(80);
  195.    DoMethod(G->DI->GUI.LV_ENTRIES, MUIM_List_InsertSingle, &new, MUIV_List_Insert_Bottom);
  196.    nnset(G->DI->GUI.LV_ENTRIES, MUIA_List_Active, MUIV_List_Active_Bottom);
  197.    DI_DisplayFunc();
  198.    if (*arg == 1)
  199.    {
  200.       DoMethod(G->WR[G->DI->WrWin]->GUI.TE_EDIT, MUIM_TextEditor_ARexxCmd, "Copy");
  201.       DoMethod(G->DI->GUI.TE_EDIT, MUIM_TextEditor_ARexxCmd, "Paste");
  202.    }
  203.    set(G->DI->GUI.WI, MUIA_Window_ActiveObject, G->DI->GUI.ST_ALIAS);
  204. }
  205. MakeHook(DI_ModifyHook, DI_ModifyFunc);
  206.  
  207. ///
  208. /// DI_OpenFunc
  209. //  Opens glossary window
  210. void SAVEDS ASM DI_OpenFunc(REG(a1,int *arg))
  211. {
  212.    if (!G->DI)
  213.    {
  214.       if (!(G->DI = DI_New())) return;
  215.       G->DI->WrWin = *arg;
  216.       if (!SafeOpenWindow(G->DI->GUI.WI)) DisposeModulePush(&G->DI);
  217.       else if (DI_Load()) set(G->DI->GUI.LV_ENTRIES, MUIA_List_Active, 0);
  218.    }
  219. }
  220. MakeHook(DI_OpenHook, DI_OpenFunc);
  221. ///
  222.  
  223. /*** GUI ***/
  224. /// DI_LV_ConFunc
  225. //  Glossary listview construction hook
  226. struct Dict * SAVEDS ASM DI_LV_ConFunc(REG(a1,struct Dict *dict))
  227. {
  228.    struct Dict *entry = malloc(sizeof(struct Dict));
  229.    memcpy(entry, dict, sizeof(struct Dict));
  230.    return entry;
  231. }
  232. MakeHook(DI_LV_ConFuncHook, DI_LV_ConFunc);
  233.  
  234. ///
  235. /// DI_LV_DesFunc
  236. //  Glossary listview destruction hook
  237. long SAVEDS ASM DI_LV_DesFunc(REG(a1,struct Dict *entry))
  238. {
  239.    if (entry->Text) FreeStrBuf(entry->Text);
  240.    free(entry);
  241.    return 0;
  242. }
  243. MakeHook(DI_LV_DesFuncHook, DI_LV_DesFunc);
  244.  
  245. ///
  246. /// DI_New
  247. //  Creates glossary window
  248. LOCAL struct DI_ClassData *DI_New(void)
  249. {
  250.    struct DI_ClassData *data;
  251.  
  252.    if (data = calloc(1, sizeof(struct DI_ClassData)))
  253.    {
  254.       data->GUI.SL_EDIT = ScrollbarObject, End;
  255.       data->GUI.WI = WindowObject,
  256.          MUIA_Window_Title, GetStr(MSG_WR_Dictionary),
  257.          MUIA_HelpNode, "DI_W",
  258.          MUIA_Window_ID, MAKE_ID('D','I','C','T'),
  259.          WindowContents, VGroup,
  260.             Child, HGroup,
  261.                Child, data->GUI.GR_LIST = ListviewObject,
  262.                   MUIA_HorizWeight, G->Weights[4],
  263.                   MUIA_Listview_DragType, MUIV_Listview_DragType_Immediate,
  264.                   MUIA_Listview_Input, TRUE,
  265.                   MUIA_Listview_DoubleClick, TRUE,
  266.                   MUIA_CycleChain, 1,
  267.                   MUIA_Listview_List, data->GUI.LV_ENTRIES = ListObject,
  268.                     InputListFrame,
  269.                     MUIA_List_ConstructHook, &DI_LV_ConFuncHook,
  270.                     MUIA_List_DestructHook , &DI_LV_DesFuncHook,
  271.                     MUIA_List_DragSortable, TRUE,
  272.                   End,
  273.                End,
  274.                Child, BalanceObject, End,
  275.                Child, data->GUI.GR_TEXT = VGroup,
  276.                   MUIA_HorizWeight, G->Weights[5],
  277.                   Child, HGroup,
  278.                      Child, Label2(GetStr(MSG_DI_Alias)),
  279.                      Child, data->GUI.ST_ALIAS = MakeString(SIZE_NAME, GetStr(MSG_DI_Alias)),
  280.                   End,
  281.                   Child, HGroup,
  282.                      MUIA_Group_Spacing, 0,
  283.                      Child, data->GUI.TE_EDIT = NewObject(CL_TextEditor->mcc_Class, NULL,
  284.                         InputListFrame,
  285.                         MUIA_CycleChain, TRUE,
  286.                         MUIA_TextEditor_Slider, data->GUI.SL_EDIT,
  287.                      End,
  288.                      Child, data->GUI.SL_EDIT,
  289.                   End,
  290.                End,
  291.             End,
  292.             Child, ColGroup(4),
  293.                Child, data->GUI.BT_NEW       = MakeButton(GetStr(MSG_DI_New)),
  294.                Child, data->GUI.BT_ADDSELECT = MakeButton(GetStr(MSG_DI_AddSelect)),
  295.                Child, data->GUI.BT_DELETE    = MakeButton(GetStr(MSG_DI_Delete)),
  296.                Child, data->GUI.BT_PASTE     = MakeButton(GetStr(MSG_DI_Paste)),
  297.             End,
  298.          End,
  299.       End;
  300.       if (data->GUI.WI)
  301.       {
  302.          DoMethod(G->App, OM_ADDMEMBER, data->GUI.WI);
  303.          DoMethod(G->App, MUIM_MultiSet, MUIA_Disabled, TRUE, data->GUI.ST_ALIAS, data->GUI.SL_EDIT, data->GUI.TE_EDIT, data->GUI.BT_DELETE, data->GUI.BT_PASTE, NULL);
  304.          set(data->GUI.WI, MUIA_Window_ActiveObject, data->GUI.GR_LIST);
  305.          SetHelp(data->GUI.LV_ENTRIES,   MSG_HELP_DI_LV_ENTRIES);
  306.          SetHelp(data->GUI.ST_ALIAS,     MSG_HELP_DI_ST_ALIAS);
  307.          SetHelp(data->GUI.BT_NEW,       MSG_HELP_DI_BT_NEW);
  308.          SetHelp(data->GUI.BT_ADDSELECT, MSG_HELP_DI_BT_ADDSELECT);
  309.          SetHelp(data->GUI.BT_DELETE,    MSG_HELP_DI_BT_DELETE);
  310.          SetHelp(data->GUI.BT_PASTE,     MSG_HELP_DI_BT_PASTE);
  311.          DoMethod(data->GUI.ST_ALIAS    ,MUIM_Notify,MUIA_String_Contents     ,MUIV_EveryTime,data->GUI.TE_EDIT      ,3,MUIM_Set,MUIA_TextEditor_HasChanged,TRUE);
  312.          DoMethod(data->GUI.BT_NEW      ,MUIM_Notify,MUIA_Pressed             ,FALSE         ,MUIV_Notify_Application,3,MUIM_CallHook,&DI_ModifyHook,0);
  313.          DoMethod(data->GUI.BT_ADDSELECT,MUIM_Notify,MUIA_Pressed             ,FALSE         ,MUIV_Notify_Application,3,MUIM_CallHook,&DI_ModifyHook,1);
  314.          DoMethod(data->GUI.BT_DELETE   ,MUIM_Notify,MUIA_Pressed             ,FALSE         ,MUIV_Notify_Application,3,MUIM_CallHook,&DI_DeleteHook,0);
  315.          DoMethod(data->GUI.BT_PASTE    ,MUIM_Notify,MUIA_Pressed             ,FALSE         ,MUIV_Notify_Application,3,MUIM_CallHook,&DI_PasteHook,0);
  316.          DoMethod(data->GUI.LV_ENTRIES  ,MUIM_Notify,MUIA_Listview_DoubleClick,TRUE          ,MUIV_Notify_Application,3,MUIM_CallHook,&DI_PasteHook,0);
  317.          DoMethod(data->GUI.LV_ENTRIES  ,MUIM_Notify,MUIA_List_Active         ,MUIV_EveryTime,MUIV_Notify_Application,3,MUIM_CallHook,&DI_DisplayHook,0);
  318.          DoMethod(data->GUI.WI          ,MUIM_Notify,MUIA_Window_CloseRequest ,TRUE          ,MUIV_Notify_Application,3,MUIM_CallHook,&DI_CloseHook,0);
  319.          return data;
  320.       }
  321.       free(data);
  322.    }
  323.    return NULL;
  324. }
  325. ///
  326.